package com.gucheng.ggrpc;

import com.gucheng.ggrpc.config.RpcConfig;
import com.gucheng.ggrpc.constant.RpcConstant;
import com.gucheng.ggrpc.utils.ConfigUtils;
import lombok.extern.slf4j.Slf4j;

/**
 * RPC框架应用
 * 相当于 holder，存放了项目全局用到的变量。双检锁单例模式实现
 */
@Slf4j
public class RpcApplication {

    private static volatile RpcConfig rpcConfig;

    /**
     *  框架初始化，支持传入自定义配置
     *
     * @param newRpcConfig
     */
    public static void init(RpcConfig newRpcConfig) {
        rpcConfig = newRpcConfig;
        log.info("RPC 初始化, config = {}", newRpcConfig.toString());
    }

    /**
     * 初始化
     */
     public static void init() {
         RpcConfig newRpcConfig;
         try {
             newRpcConfig = ConfigUtils.loadConfig(RpcConfig.class, RpcConstant.DEFAULT_CONFIG_PREFIX);
         } catch (Exception e) {
             newRpcConfig = new RpcConfig();
         }
         init(newRpcConfig);
     }

    /**
     * 获取配置
     *
     * @return
     */
    public static RpcConfig getRpcConfig() {
         if (rpcConfig == null) {
             synchronized (RpcApplication.class) {
                 if (rpcConfig == null) {
                     init();
                 }
             }
         }
        return rpcConfig;
     }
}
